module hmscounter(clk, rst, h2, h1, m2, m1, s2, s1);
    input clk;                        // 输入时钟信号
    input rst;                        // 输入复位信号

    output [3:0] h2;                   // 输出寄存器，用于输出小时的高位（4位）
    output [3:0] h1;                   // 输出寄存器，用于输出小时的低位（4位）
    output [3:0] m2;                   // 输出寄存器，用于输出分钟的高位（4位）
    output [3:0] m1;                   // 输出寄存器，用于输出分钟的低位（4位）
    output [3:0] s2;                   // 输出寄存器，用于输出秒钟的高位（4位）
    output [3:0] s1;                   // 输出寄存器，用于输出秒钟的低位（4位）

    wire clk1, clk2, clk3, clk4, clk5, clk6;    // 中间时钟信号
    wire sel_h1;                                // 时钟选择信号
    
    assign sel_h1 = (h2 == 4'd0 || h2 == 4'd1) ? 1 : 0;    // 根据h2的值判断是否需要选择h1的计数模式

    // 实例化counterN模块，用于计算秒个位
    counterN CN_s1(
        .clk(clk),
        .rst(rst),
        .sel(1'b1),
        .q1(s1),
        .q2(clk1)
    );

    // 实例化counterN模块，用于计算秒十位
    counterN CN_s2(
        .clk(clk1),
        .rst(rst),
        .sel(1'b0),
        .q1(s2),
        .q2(clk2)
    );

    // 实例化counterN模块，用于计算各位
    counterN CN_m1(
        .clk(clk2),
        .rst(rst),
        .sel(1'b1),
        .q1(m1),
        .q2(clk3)
    );

    // 实例化counterN模块，用于计算十
    counterN CN_m2(
        .clk(clk3),
        .rst(rst),
        .sel(1'b0),
        .q1(m2),
        .q2(clk4)
    );

    // 实例化带有参数的counterN模块，个位 变换参数，24进制
    counterN #(4'd10, 4'd4) CN_h1(
        .clk(clk4),
        .rst(rst),
        .sel(sel_h1),
        .q1(h1),
        .q2(clk5)
    );

    // 实例化带有参数的counterN模块，用于计算十
    counterN #(4'd3) CN_h2(
        .clk(clk5),
        .rst(rst),
        .sel(1'b1),
        .q1(h2),
        .q2(clk6)
    );
    
endmodule
